package com.dwy2002.product.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dwy2002.common.Result;
import com.dwy2002.pojo.dto.product.ProductPageDTO;
import com.dwy2002.pojo.dto.product.ProductsDTO;
import com.dwy2002.pojo.dto.users.ProductFavoritesPageDTO;
import com.dwy2002.pojo.po.product.Products;
import com.dwy2002.pojo.vo.product.ProductDetailVO;

import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/02/17
 */
public interface IProductsService extends IService<Products> {

    /**
     * 添加商品
     *
     * @param products 接收前端的商品数据
     * @author 杜伟毅
     * @since 2025/2/18 0018 21:29
     */
    Result<Void> saveProduct(ProductsDTO products);

    /**
     * 删除商品（支持单个删除和批量删除）
     *
     * @param ids 商品id集合
     * @author 杜伟毅
     * @since 2025/2/19 0019 23:43
     */
    Result<Void> deleteListProduct(List<String> ids);

    /**
     * 分页查询
     * <p>
     * 查询：可按标题搜索
     * <p>
     * 排序：可按商品规格、商品创建时间、商品修改时间、商品数量、商品价格进行升序和降序排序
     * <p>
     * 分类：可按是否售罄、计量单位进行分类。
     *
     * @param productPage 商品分页数据
     * @author 杜伟毅
     * @since 2025/2/23 0023 21:24
     */
    Result<Page<Products>> getProductPage(ProductPageDTO productPage);

    /**
     * 获取商品详情
     *
     * @param id 商品id
     * @author 杜伟毅
     * @since 2025/2/27 0027 10:02
     */
    Result<ProductDetailVO> getProductDetail(String id) throws ExecutionException, InterruptedException;

    /**
     * 修改商品
     *
     * @param products 接收前端的商品数据
     * @author 杜伟毅
     * @since 2025/2/19 0019 15:54
     */
    Result<Void> updateProduct(ProductsDTO products);

    /**
     * 下架商品
     *
     * @param id 商品id
     * @author 杜伟毅
     * @since 2025/3/2 0002 11:08
     */
    Result<Void> takeOffProduct(String id);

    /**
     * 上架商品
     *
     * @param id 商品id
     * @author 杜伟毅
     * @since 2025/3/2 0002 15:07
     */
    Result<Void> listProduct(String id);

    /**
     * 扣减商品
     *
     * @param productId 商品id
     * @param quantity  购买数量
     * @author 杜伟毅
     * @since 2025/3/10 0010 22:37
     */
    void deductionProduct(String productId, Integer quantity);

    /**
     * 根据分页数据查询商品
     *
     * @param productIds 商品id集合
     * @param dto        商品收藏DTO
     * @author 杜伟毅
     * @since 2025/3/25 0025 23:55
     */
    List<Products> queryProductsWithDynamicConditions(List<String> productIds, ProductFavoritesPageDTO dto);

    /**
     * 获取商品单位
     *
     * @author 杜伟毅
     * @since 2025/5/9 0009 17:25
     */
    Result<List<String>> getProductUnit();
}
